package com.yuews.codegenerator.template;

import freemarker.cache.FileTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

/**
 * 模板引擎 - 基于Freemarker
 */
public class TemplateEngine {
    private Configuration configuration;

    public TemplateEngine(String templateDir) throws IOException {
        configuration = new Configuration(Configuration.VERSION_2_3_31);
        
        // 设置模板加载器
        if (templateDir != null && !templateDir.isEmpty()) {
            File templateDirFile = new File(templateDir);
            if (templateDirFile.exists() && templateDirFile.isDirectory()) {
                configuration.setTemplateLoader(new FileTemplateLoader(templateDirFile));
            } else {
                // 如果自定义模板目录不存在，使用默认的类路径模板
                configuration.setClassForTemplateLoading(TemplateEngine.class, "/templates");
            }
        } else {
            // 默认使用类路径下的templates目录
            configuration.setClassForTemplateLoading(TemplateEngine.class, "/templates");
        }
        
        // 设置模板编码
        configuration.setDefaultEncoding("UTF-8");
        
        // 设置模板异常处理
        configuration.setTemplateExceptionHandler(freemarker.template.TemplateExceptionHandler.RETHROW_HANDLER);
        
        // 设置日志记录器
        configuration.setLogTemplateExceptions(false);
    }

    /**
     * 渲染模板
     * @param templateName 模板文件名
     * @param data 模板数据
     * @return 渲染后的字符串
     */
    public String renderTemplate(String templateName, Map<String, Object> data) throws IOException, TemplateException {
        Template template = configuration.getTemplate(templateName);
        StringWriter writer = new StringWriter();
        template.process(data, writer);
        return writer.toString();
    }

    /**
     * 检查模板是否存在
     * @param templateName 模板文件名
     * @return 是否存在
     */
    public boolean hasTemplate(String templateName) {
        try {
            configuration.getTemplate(templateName);
            return true;
        } catch (IOException e) {
            return false;
        }
    }
}